package com.example.demo.demo.string;

/**
 * equals 和 ==的区别
 *
 * == 或 !=   比较的是 栈中存放的对象引用 在堆上的地址，
 * 即判断两对象的堆地址是否相同，即是否是指相同一个堆对象。
 *
 * Object.equals()使用的算法区分度高，只要两对象不是同一个就是错误的。
 * 由于所有的类都继承自Object类，所以equals()适用于所有对象。Object中的equals方法返回 == 的判断，即对象的地址判断。
 * 虽然如此，但可以对Object.equals()进行覆盖，String类则实现覆盖。我们再来看看String.equals()：
 *
 * 查看String对equals覆盖的源码会发现，String.equals()相等的条件是：比较二者同为String类型，长度相等，且字符串值完全相同，
 * 包括顺序和值，不再要求两者为同一对象。也可以理解为String.equals()将原本的String对象拆分成单个字符之间值的比较，
 * 每个字符的比较完之后返回一个最终的boolean类型的值，即将原本可能指向不同堆地址的两个对象  "间接的" 指向了同一个地址,以到达比较值的目的。
 *
 * @author luowj12
 * @since 2021/5/13 10:09
 */
public class StringTest {

    public static void main(String[] args) {
        String str1=new String("hello");
        String str2=new String("hello");
        String str3="hello";
        String str4="hello";
        //字符串常量相加，在编译时就会计算结果，str3 == str5 返回ture
        String str5 = "he" + "llo";
        String str6 = "he"; String str7 = "llo";
        //字符串变量相加，编译时无法计算，str3 == str8 返回false
        String str8 = str6 + str7;
        //结果为true
        System.out.println("str1.equals(str2): "+str1.equals(str2));
        //1.结果为true
        System.out.println("str1.equals(str3): "+str1.equals(str3));
        //2.结果为false
        System.out.println("(str1==str3) "+(str1==str3));
        //结果为true
        System.out.println("(str3==str4) "+(str3==str4));
        //结果为false
        System.out.println("(str1==str2) "+(str1==str2));

    }

}
